package city.spring.modules.work.action.model;

/**
 * 排班方案的参与人员信息
 *
 * @author HouKunLin
 * @date 2020/6/24 0024 10:23
 */
public abstract class AbstractPlanUser<USER> {
    /**
     * 当前人员使用次数
     */
    private int useNumber = 0;

    /**
     * 该人的唯一Key
     *
     * @return 唯一键值
     */
    public abstract Object getKey();

    /**
     * 该人的姓名
     *
     * @return 姓名
     */
    public abstract String getTitle();

    /**
     * 该用户限制的上班次数
     *
     * @return 上班次数
     */
    public abstract int getWorkNumber();

    /**
     * 获取原始对象
     *
     * @return 原始对象
     */
    public abstract USER getObject();

    /**
     * 获取该人的使用次数
     *
     * @return 使用次数
     */
    public final int getUseNumber() {
        return useNumber;
    }

    /**
     * 判断是否能够使用该人
     *
     * @return the boolean
     */
    public final boolean canUse() {
        int workNumber = getWorkNumber();
        if (workNumber <= -1) {
            // 自动计划人员上班次数
            return true;
        }
        // 当可使用次数 workNumber 等于使用次数 useNumber 时不允许再次参与排班
        return workNumber != useNumber;
    }

    /**
     * 使用该人
     */
    public final void usePeople() {
        ++useNumber;
    }

    @Override
    public boolean equals(Object object) {
        if (object instanceof AbstractPlanUser) {
            AbstractPlanUser<?> planUser = (AbstractPlanUser<?>) object;
            Object key1 = this.getKey();
            Object key2 = planUser.getKey();
            return key1 != null && key1.equals(key2);
        }
        return false;
    }

    @Override
    public String toString() {
        return String.format("%s(%s/%s)", getTitle(), getUseNumber(), getWorkNumber());
    }
}
